home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_09_03 / 9n03125a < prev    next >
Text File  |  1991-01-14  |  2KB  |  82 lines

  1.  
  2. #include <stdio.h>
  3. #include <signal.h>
  4. #include <assert.h>
  5. #include <setjmp.h>
  6. #include <string.h>
  7. #include <stdlib.h>
  8.  
  9. #define streq(x,y)    (0 == strcmp(x,y))
  10.  
  11. /* reserved to us if name begins with asterisk */
  12. #define SIG_RESERVED(x)    (signals[x].name[0] == '*')
  13.  
  14. void sig_handler();
  15. void print_signal();
  16.  
  17. enum cmd_status {CMD_OK, CMD_ERROR};
  18.  
  19. enum cmd_status
  20. cmd_trap(argc,argv)
  21. int argc;
  22. char **argv;
  23. {
  24.     enum cmd_status rc = CMD_OK;
  25.     char *action = 0;
  26.     int len;    /* length of action */
  27.     int i;
  28.  
  29.     if (argc == 1) {
  30.         for (i=0;i<NSIG;i++) print_signal(i);
  31.         return(rc);
  32.     }
  33.  
  34.     if (-1 == string_to_signal(argv[argc-1])) {
  35.         action = argv[argc-1];
  36.         argc--;
  37.     }
  38.  
  39.     for (i=1;i<argc;i++) {
  40.         int sig = string_to_signal(argv[i]);
  41.         if (sig < 0 || sig >= NSIG) {
  42.             fprintf(stderr,"trap: invalid signal %s",argv[i]);
  43.             rc = CMD_ERROR;
  44.             break;
  45.         }
  46.  
  47.         if (!action) {
  48.             print_signal(sig);
  49.             continue;
  50.         }
  51.  
  52.         if (SIG_RESERVED(sig)) {
  53.             fprintf(stderr,"trap: cannot trap (%s)",argv[i]);
  54.             rc = CMD_ERROR;
  55.             break;
  56.         }
  57.  
  58.         if (signals[sig].action) free(signals[sig].action);
  59.  
  60.         if (streq(action,"SIG_DFL")) {
  61.             signal(sig,signals[sig].defaultX);
  62.             signals[sig].action = 0;
  63.         } else {
  64.             len = 1 + strlen(action);
  65.             if (0 == (signals[sig].action = malloc(len))) {
  66.                 fprintf(stderr,"trap: malloc failed");
  67.                 signal(sig,signals[sig].defaultX);
  68.                 rc = CMD_ERROR;
  69.                 break;
  70.             }
  71.             memcpy(signals[sig].action,action,len);
  72.             if (streq(action,"SIG_IGN")) {
  73.                 signal(sig,SIG_IGN);
  74.             } else signal(sig,sig_handler);
  75.         }
  76.     }
  77.     return(rc);
  78. }
  79.  
  80.  
  81.  
  82.